'''''
字符串格式化操作符，需要程序员明确转换类型参数，
比如到底是转成字符串、整数还是其他什么类型。
新式的字符串模板的优势是不用去记住所有相关细节，
而是像shell风格的脚本语言里面那样使用美元符号($).
由于新式的字符串引进Template对象，
Template对象有两个方法：substitute()、safe_substitute()。
substitute()更为严谨，在key缺少的情况下会报一个KeyError的异常。
safe_substitute()在缺少key的情况下，直接原封不动的把字符串显示出来。
'''
#导入Template对象
from string import Template
from utils.tool.CacheKeyValue import CacheKeyValue
import re

#保存值到 缓存
def save_string( sValue,  ParaName):
    CacheKeyValue.getInstance().set(eval_string(ParaName),eval_string(sValue))

#提取解析参数化字符串  形如 ${xxxx}
def eval_string(paraString):
    pattern = r"(\${.*?}|{%.*?%}|{#.*?#})"
    #pattern = r"(\\$)(\\{.*?\\})"
    #pattern = r"{{.*?}}|\${.*?}"   #|{.*?}"
    # pattern = r"\{\{.*?\}\}"  #|\$\{.*?\}"

    s = paraString
    rg = re.compile(pattern,re.RegexFlag.IGNORECASE|re.RegexFlag.DOTALL)
    
    i=0
    while rg.search( s ):
        s= Template(s).safe_substitute(CacheKeyValue.getInstance().mem)
        if i>= 4:   #循环多次 中断，避免死循环
            break
        i+=1
    
    return s

def eval_datas(datas={}):
    for k  in datas:
        vv = eval_string("${%s}" % k)
        datas[k] = vv if('${' not in vv ) else datas.get(k)
    return datas

if __name__=="__main__":
    tt = "aldjfl${kkk}kqj {{gogo}} erwe ${gogo} uwer${${aaa}}"
    save_string("哈哈哈", "gogo")
    save_string("嘿嘿","kkk")
    save_string("gogo","aaa")

    print(eval_string(tt))

